﻿using System;
using Onshi.POS.Comun.Vistas;
using Onshi.POS.Modelo.Entidades;
using Onshi.POS.Modelo.Enumeradores;
using Onshi.POS.Repositorios;

namespace Onshi.POS.Comun
{
    public class DomiciliosAltaModificacionPresentador
    {
        #region Constructores

        public DomiciliosAltaModificacionPresentador(IDomiciliosAltaModificacion vista)
            : base()
        {
            this.vista = vista;
        }

        #endregion

        #region Atributos

        private IDomiciliosAltaModificacion vista;

        #endregion

        #region Propiedades

        public RepositorioTipoDomicilio RepositorioTipoDomicilio
        {
            get { return new RepositorioTipoDomicilio(); }
        }

        public RepositorioBarrio RepositorioBarrio
        {
            get { return new RepositorioBarrio(); }
        }

        #endregion

        #region Metodos

        public void Aceptar()
        {
            var tipo = RepositorioTipoDomicilio.DevolverPorId(vista.IdTipoDomicilio);
            if (tipo == null)
                throw new Exception("El tipo de domicilio no existe");
            var barrio = RepositorioBarrio.DevolverPorId(vista.IdBarrio);
            if (barrio == null)
                throw new Exception("El barrio no existe");
            if (vista.Calle == String.Empty)
                throw new Exception("La calle no puede quedar vacia");
            if (vista.Numero == String.Empty)
                throw new Exception("El número no puede quedar vacio");
            Int32 numero;
            if (!Int32.TryParse(vista.Numero.Trim(), out numero))
                throw new Exception("El número debe ser numérico");
            switch (vista.TipoDomicilio)
            {
                case EnumTipoEntidad.DOMICILIO_VENDEDOR:
                    var domicilioVendedor = new DomicilioVendedor();
                    domicilioVendedor.Tipo = tipo;
                    domicilioVendedor.Barrio = barrio;
                    domicilioVendedor.Calle = vista.Calle.Trim();
                    domicilioVendedor.Numero = numero.ToString();
                    domicilioVendedor.Piso = vista.Piso.Trim();
                    domicilioVendedor.Departamento = vista.Departamento.Trim();
                    domicilioVendedor.Observacion = vista.Observacion.Trim();
                    vista.Domicilio = domicilioVendedor;
                    break;
                case EnumTipoEntidad.DOMICILIO_PROVEEDOR:
                    var domicilioProveedor = new DomicilioProveedor();
                    domicilioProveedor.Tipo = tipo;
                    domicilioProveedor.Barrio = barrio;
                    domicilioProveedor.Calle = vista.Calle.Trim();
                    domicilioProveedor.Numero = numero.ToString();
                    domicilioProveedor.Piso = vista.Piso.Trim();
                    domicilioProveedor.Departamento = vista.Departamento.Trim();
                    domicilioProveedor.Observacion = vista.Observacion.Trim();
                    vista.Domicilio = domicilioProveedor;
                    break;
                case EnumTipoEntidad.DOMICILIO_CLIENTE:
                    var domicilioCliente = new DomicilioCliente();
                    domicilioCliente.Tipo = tipo;
                    domicilioCliente.Barrio = barrio;
                    domicilioCliente.Calle = vista.Calle;
                    domicilioCliente.Numero = numero.ToString();
                    domicilioCliente.Piso = vista.Piso;
                    domicilioCliente.Departamento = vista.Departamento;
                    domicilioCliente.Observacion = vista.Observacion;
                    vista.Domicilio = domicilioCliente;
                    break;
            }
        }

        public void Inicializar()
        {
            if (vista.EstadoABM == EnumEstadoAltaBajaModificacionHabilitacion.MODIFICACION)
            {
                if (RepositorioTipoDomicilio.DevolverPorId(vista.IdTipoDomicilio) == null)
                    throw new Exception("El tipo de domicilio no existe");
                if (RepositorioBarrio.DevolverPorId(vista.IdBarrio) == null)
                    throw new Exception("El barrio no existe");
                vista.IdTipoDomicilio = vista.IdTipoDomicilio;
                vista.IdBarrio = vista.IdBarrio;
                vista.Calle = vista.Calle.Trim();
                vista.Numero = vista.Numero.Trim();
                vista.Piso = vista.Piso.Trim();
                vista.Departamento = vista.Departamento.Trim();
                vista.Observacion = vista.Observacion.Trim();
            }
        }

        #endregion
    }
}
